package cn.jasonone.tio.tcp.handler;

import cn.jasonone.tio.tcp.commons.Command;
import cn.jasonone.tio.tcp.model.Header;
import org.tio.core.ChannelContext;

import java.io.Serializable;
import java.util.Map;

/**
 * 命令处理器
 *
 * @author xujie
 * @version 1.0
 * @date 2022/1/18 16:04
 */
public interface CommandHandler<T> {
    /**
     * 当前处理器可以处理的命令类型
     *
     * @return
     */
    Command getCommand();

    /**
     * 是否将数据包[{@link cn.jasonone.tio.tcp.model.Data}]直接传入handler方法
     *
     * @return
     */
    default boolean isPacket() {
        return false;
    }

    /**
     * 反序列化之前调用
     *
     * @param context
     * @param header
     * @param datas
     */
    default byte[] deserializeBefore(Map<String, Object> context, Header header, byte[] datas) {
        return datas;
    }

    /**
     * 序列化之前调用
     *
     * @param context
     * @param header
     * @param data
     */
    default T serializeBefore(Map<String, Object> context, Header header, T data) {
        return data;
    }


    /**
     * 处理命令
     *
     * @param data
     * @param ctx
     */
    void handler(T data, ChannelContext ctx) throws Exception;
}
